#pragma once
#include"Addr.hpp"
#include"mymutex.hpp"
#include"mylog.hpp"
#include<iostream>
#include<vector>
#include<string>
using namespace my_log;
using namespace my_mutex;
//用于消息的路由发送功能
class Route
{
private:
    void AddUsr(Addr& peer)
    {
        _v.push_back(peer);
        LOG(LogLevel::DEBUG)<<"新增一个在线用户"<<peer.GetAddr();
    }
    bool is_exist(Addr& peer)
    {
        for(auto& usr:_v)
        {
            if(peer==usr)
            {
                //存在
                return true;
            }
        }
        return false;
    }
    void DeleteUsr(Addr& peer)
    {
        for(auto usr=_v.begin();usr!=_v.end();usr++)
        {
            if(peer==(*usr))
            {
                LOG(LogLevel::DEBUG)<<"删除一个在线用户"<<peer.GetAddr()<<"成功";
                _v.erase(usr);
                break;
            }
        }
    }
public:
    Route()
    {}
    //将消息发给在线的用户
    void Send(int sockfd,std::string& message,Addr& peer)
    {
        //上锁
        my_mutex::mymutex mutex;
        mutex.lock();
        if(!is_exist(peer))//该用户不存在
        {
            //添加
            AddUsr(peer);
        }
        std::string sendmessage=peer.GetAddr()+"says@"+message;
        //存在，则给每一个已经登录的用户发去消息
        for(auto usr:_v)
        {
            sendto(sockfd, sendmessage.c_str(), sendmessage.size(), 0, (struct sockaddr *)&(peer.Sockaddr()), sizeof(peer.Sockaddr()));
        }
        if(message=="QUIT")
        {
            LOG(LogLevel::DEBUG)<<"删除一个在线用户"<<peer.GetAddr();
            DeleteUsr(peer);
        }
        mutex.unlock();
    }
    ~Route()
    {}
private:
    //一个vector容器来储存用户信息
    std::vector<Addr> _v;
};